package threadPool.ThreadFactory;

import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 我们通常使用线程池submit方法将任务提交到线程池内执行
 * 如果此时线程池内有空闲线程，则会立即执行该任务，如果没有则需要庚戌线程池的类型选择等待
 * 或者拆功能键新线程
 * 所以现车给池内的吸纳成并不是线程池对象初始化的时候就创建好的，而是有任务提交进来之后才创建的，
 * 而创建线程的过程是无法干预的
 * 如果我们想在每个线程厂检的时候记录一些日志，过着推送一些消息时，
 * 1.使用ThreadFactory接口的实现类
 * 2.创建线程池时传入ThreadFactory对象
 */
public class MyThreadFactory implements ThreadFactory {
    private String factoryName;
    private boolean saveLog;
    public MyThreadFactory(String factoryName, boolean saveLog) {
        this.factoryName = factoryName;
        this.saveLog = saveLog;
    }

    @Override
    public Thread newThread(Runnable r) {
        if(saveLog){
            // 动态日志输出
            System.out.println(System.currentTimeMillis() + this.factoryName + " create start");
        }
        Thread thread = new Thread(r);

        // 自定义线程名字
        thread.setName("Kevin-Thread-" + thread.getName() + ":" + thread.getId());
        try {
            Thread.sleep(ThreadLocalRandom.current().nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(saveLog){
            System.out.println(System.currentTimeMillis()+ this.factoryName + " "
             + thread.getName() + " create end");
        }
        return thread;
    }

}
